void main() {
//  fun1(text: 20);

//  print(say('Bob', 'Howdy') == 'Bob says Howdy');
//  print(say('Bob', 'Howdy', 'smoke signal') ==
//      'Bob says Howdy with a smoke signal');

//  print(defult(text: "233"));
//  print(defult());

//  var list = [1, 2, 3];
//  // 将 printElement 函数作为参数传递。
//  list.forEach(printElement);

//  var list = ['apples', 'bananas', 'oranges'];
//  list.forEach((item) {
//    print('${list.indexOf(item)}: $item');
//  });

// 创建一个加 2 的函数。
//  var add2 = makeAdder(2);
//  // 创建一个加 4 的函数。
//  var add4 = makeAdder(4);
//  print(add2);
//  print(add4);
//  print(add2(3));
//  print(add4(3));
//  print(add2(3) == 5);
//  print(add4(3) == 7);

  var x;
  // 比较顶级函数。
  x = foo;
  print(foo == x);

  print(foo == null);
}

// 命名可选参数
void fun1({text: "1"}) {
  print(text);
}

// 位置可选参数
String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

// 默认参数
String defult({var text = "10"}) {
  return text;
}

// 函数是一等对象
void printElement(int element) {
  print(element);
}

//
bool topLevel = true;

// 词法作用域
void scope() {
  var insideMain = true;

  void myFunction() {
    var insideFunction = true;

    void nestedFunction() {
      var insideNestedFunction = true;

      print(topLevel);
      print(insideMain);
      print(insideFunction);
      print(insideNestedFunction);
    }
  }
}

/// 返回一个函数，返回的函数参数与 [addBy] 相加。
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

// 测试函数是否相等
void foo() {} // 顶级函数